package br.com.app.dao;

import java.io.Serializable;
import java.util.List;
import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;


public class DAOGenerico<T, PK extends Serializable> implements DAO<T, PK>  {

	EntityManager entityManager = EMF.get().createEntityManager();
	
    protected Class<T> tipo;
    
    public DAOGenerico() {
    	this.tipo = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}

	@Override
    public List<T> listar() {
        List<T> tuplas = entityManager.createQuery("select entidade from " + tipo.getSimpleName() + " entidade").getResultList();
        tuplas.size();
        return tuplas; 
    }

    @Override
    public T buscar(PK pk){
    	T entidade = null;
    	entidade = entityManager.find(tipo, pk);
        return entidade;
    }

    @Override
    public T salvar(T entidade){
        try {
            entityManager.getTransaction().begin();
            entityManager.persist(entidade);            
        } finally{
            entityManager.getTransaction().commit();
        }        
	return entidade;
    }

    @Override
    public void alterar(T entidade){
        try {
            entityManager.getTransaction().begin();
            entityManager.merge(entidade);
        } finally{
            entityManager.getTransaction().commit();
        }
    }

    @Override
    public void remover(T entidade){
        entityManager.refresh(entidade);
        try {
            entityManager.getTransaction().begin();
            entityManager.remove(entidade);
        } finally{
            entityManager.getTransaction().commit();
        }	
    }
    
    @Override
    public void remover(Long id){
        Object toRemove = entityManager.find(tipo,id);
        try {
            entityManager.getTransaction().begin();
            entityManager.remove(toRemove);
        } finally{
            entityManager.getTransaction().commit();
        }	
    }

}